package limfic.servicios.equipo;

import limfic.dominio.Equipo;
import limfic.persistencia.AbstractDB;
import limfic.persistencia.mysql.equipo.IEquipoRepositorio;
import limfic.persistencia.RepositorioException;
import limfic.servicios.ServicioException;
import limfic.ui.IUsuarioInterfazEquipo;
import java.util.List;

/**
 *Clase que implementa todas las operaciones generales del servicio equipo
 * @author OpenCodes
 * @see IEquipoServicio
 */
public class EquipoServicio implements IEquipoServicio {

    private AbstractDB fabricaDb;

    @Override
    public void init(IUsuarioInterfazEquipo ui) {
        fabricaDb = AbstractDB.getInstance();
    }

    @Override
    public void agregar(IUsuarioInterfazEquipo ui) throws ServicioException {
        if (existe(ui.getNombre())) {
            throw new ServicioException("Ya existe una equipo con el mismo nombre");
        }

        Equipo equipo = new Equipo(ui.getId(), ui.getNombre());

        IEquipoRepositorio repo;

        try {
            repo = fabricaDb.getEquipoRepositorio();
            repo.agregar(equipo);

        } catch (RepositorioException e) {
            throw new ServicioException("Fallo la incorporacion del Equipo, nombre:" + equipo.getNombre(), e);
        }
    }

    @Override
    public void eliminar(IUsuarioInterfazEquipo ui) throws ServicioException {
        Equipo equipo = new Equipo(ui.getId(), ui.getNombre());

        IEquipoRepositorio repo;

        try {
            repo = fabricaDb.getEquipoRepositorio();
            repo.eliminar(equipo);

        } catch (RepositorioException e) {
            throw new ServicioException("Fallo la eliminacion del equipo Nombre:" + equipo.getNombre(), e);
        }
    }

    @Override
    public void listarTodos(IUsuarioInterfazEquipo ui) throws ServicioException {
        IEquipoRepositorio repo;

        try {
            repo = fabricaDb.getEquipoRepositorio();
            List<Equipo> lista = repo.obtenerTodos();
            ui.setListaEquipos(lista);
        } catch (RepositorioException e) {
            throw new ServicioException("Fallo el listado de equipos", e);
        }
    }

    @Override
    public void listarAlgunos(IUsuarioInterfazEquipo ui, String nombre) throws ServicioException {
        IEquipoRepositorio repo;

        try {

            repo = fabricaDb.getEquipoRepositorio();

            String[] parametrosBusqueda = {nombre};

            List<Equipo> lista = repo.obtenerAlgunos(parametrosBusqueda);
            ui.setListaEquipos(lista);
        } catch (RepositorioException e) {
            throw new ServicioException("Fallo el listado de equipos (Busqueda)", e);
        }
    }

    @Override
    public void modificar(IUsuarioInterfazEquipo ui) throws ServicioException {
        Equipo equipo = new Equipo(ui.getId(), ui.getNombre());

        IEquipoRepositorio repo;

        try {
            repo = fabricaDb.getEquipoRepositorio();
            repo.modificar(equipo);

        } catch (RepositorioException e) {
            throw new ServicioException("Fallo la modificacion del equipo: Id:" + equipo.getId() + ", Nombre: " + equipo.getNombre(), e);
        }
    }

    @Override
    public boolean existe(String nombre) throws ServicioException {
        IEquipoRepositorio repo;

        try {

            repo = fabricaDb.getEquipoRepositorio();

            String[] parametrosBusqueda = {nombre};

            return repo.existe(parametrosBusqueda);

        } catch (RepositorioException e) {

            throw new ServicioException(e.getMessage(), e);
        }
    }
}
